package cn.dduan.fool.thread.pool.future;

import cn.dduan.fool.callable.MyCallable;
import lombok.extern.slf4j.Slf4j;

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;

/**
 * 异步计算结果（Future）
 * cancel(true)：中断线程停止任务，返回true
 * cancel(false)：线程正常执行至完成，返回false
 * get()：获取结果，若无结果会阻塞至异步计算完成
 * get(long timeOut, TimeUnit unit)：获取结果，超时返回null
 * isDone()：执行结束（完成/取消/异常）返回true
 * isCancelled()：任务完成前被取消返回true
 * 
 * @author dduan
 * @version 1.0       
 * @date 2023/3/19
 */
@Slf4j
public class MyFuture {
    public static void main(String[] args) {
        // 1、获取线程池对象
        ExecutorService es = Executors.newCachedThreadPool();
        // 2、创建Callable类型对象
        Future<Integer> future = es.submit(new MyCallable());
        // 3、判断任务是否已经完成
        boolean done = future.isDone();

        log.info("第一次判断任务是否完成：{}", done);
        // 4、判断任务是否取消
        boolean cancelled = future.isCancelled();
        log.info("第一次判断任务是否取消：{}", cancelled);
        // 5、取消任务执行
        boolean b = future.cancel(true);
        log.info("取消任务执行的结果：{}", b);
    }
}
